這篇內容大多參考 Introduction to ApplicationHost.config | Microsoft Learn 這篇而成,大致上就是整理這篇的內容依我的理解把脈絡列出。
上篇有提過,在那些比較高層級的設定檔裡,我們相對高機會去察看的就屬 ApplicationHost.config。它的範圍包含網站、Application Pool、Virtual Directory、Application,也是全域的預設設定。在 Web.config 沒做特別設定的項目上,如果這邊有設定,就會以這邊為主。
下面會介紹各個出現在 ApplicationHost.config 中的 section,在預設的 config 中如果沒有顯示的,就是會參照預設值,可見上篇的 schema 部分說明。
做為一個以 XML 來撰寫的設定檔,開頭基本上會包含聲明這件事(optional,但有加是比較好的practice,或者嘗試讀取它的程式會需要清楚知道它是 xml),並且所有內容都會包含在 這個標籤裡。
如果我們把 configuration 標籤裡的第一層都收起來,就會像是這個樣子:
第一個段落是 ,如果攤開來看,可以發現這部分指明了這份設定檔中其他 section 的架構跟關聯範圍。Section 是設定檔中的最小部署/註冊/鎖定/搜尋單位。Section 中不能彼此巢狀關聯下去,而是由 Section Group 來內涵 Section。 Section Group 中會涵蓋功能/邏輯性上相關的 Section,Section group 本身負責的就是把各項內容蒐集在一起,上面不會直接掛有設定。
如下圖中的 system.ftpServer 的這個 section group,就會對應到文檔後面的 system.ftpServer tag。也可以看到就如上面所說,Section 的外層會由 Section Group 所包覆,Section Group 本身只有標籤,沒有掛上設定屬性。這邊如果有 overrideModeDefault,就會阻止 Web.config 來覆寫這個值,這個值就會被留在 ApplicationHost.confg 中。
另外一個屬性值 allowDefinition 則有五個值,代表該 Section 可在哪個設定檔層級被定義。我已經在文字上做連結,有興趣可以直接點進去看。在沒有掛這個標籤的 Section 上,表示會採用預設值,也就是 “Everywhere”,任何設定層級都能夠去定義該 Section。
以我這份設定檔來說,其餘部分為 configProtectedData, system.applicationHost, system.webServer, system.ftpServer 和 location。
configProtectedData 會寫明一些與加密方式相關的 providers,以 IIS 10 來說這邊寫的可能就會是 IISCngProvide,基本不太會去動這一塊的設定。
system.applicationHost 底下主要就包含和網站運行比較直接相關的設定,也是比較常查看的一塊。像是目前設定中的 application pool 就能在這邊找到完整對應,各個 site 的階層結構(site / application / virtual directory)、Binding和 site 階層非模組的設定(簡單的說就是指不在 Web.config 中的),就會在這個段落。
system.webServer 就是 IIS 上各模組的設定內容,當點了最上層的 Home 而非網站,相關設定就會直接映射在這裡,也會讓網站在沒有個別設定的情況下使用者邊的值。在比較多個檔案的時候,還是要以靠近下面的階層為主,比如 Web.config 在允許(允許 override,允許在該層級設定)的情況下是會被優於 ApplicationHost.config 被套用的。
system.ftpServer 就不用多說了,就和名字一樣,基本你會看到結構中很多 section 都很像上面看過得,只是這邊的設定就是給 ftpServer 而不是 webServer 套用的。
最後一個段落是 location。 location 的這個 section 中最重要的屬性就是 location 本身上面掛的 path。前面說過,網站層級可能有各自的設定,是為 Web.config,存放在各自專案資料夾裡面。但當不想用這種分散式的方式,location 就是一個可能的替代方案。location 的 section 讓同一份設定檔中能包含多個不同網站的設定,並用 location 來定義該網站的相對位置。
“” 或 “.” 表示根層級,也就是全域設定,在不寫 path 的情況下會預設為這個。
“sitename” 直接寫上網站名稱的話就是以下設定為該網站所屬,是網站的根層級。
“sitename/application”,”sitename/application/vdir”,”sitename/application/vdir/file.ext”,這些都是允許的層級寫法,可以細部指名到單一 app,單一 virtual directory,甚至是單一檔案。
要注意的只有儘管可以存在多個不同的 location section(出現位置跟先後並不影響設定效力,完全依照設定的 path 階層來套用設置),但完全相同的 path 的 location section,在整份檔案中只能出現一次。如果子層級有差異那就沒關係。
如上圖依序為全域、Default Web Site,DemoWebsite的設定套用,在結合其他網站比較各項設定的時候,也要注意這邊的設定有被一起考慮到。
基本上這樣就是 ApplicationHost.config 裡的主要檔案結構,依循主要結構能快速讓你知道你要查找的設定在哪一個區塊,再依據細部標籤下去細讀,就會找到你要的設定了。大部分的設定概念跟層級也不只適用於這個檔案,可以套用在讀其他 IIS 相關的設定檔也會是差不多的模式。